--[[
    函数require在表package.loaded中检査模块是否已被加载。
    如果模块已经被加载，函数require就返回相应的值。
    因此，一旦一个模块被加载过，后续的对于同一模块的所有
]]
-- require 找不到指定模块时 会去加载相应的c语言库
-- 会促使重新加载
-- package.loaded.modname = nil 尽量避免重复加载
-- 搜索顺序
-- sql sql.lua c:\windows\sql /usr/local/lua/sql/sql.lua
path = ".\\?.dll;c:\\Program Files\\Lua\\dll\\?.dll"
print(package.searchpath("Lua",path)) 
--[[
    nil     no file '.\X.dll'
    no file 'c:\Program Files\Lua\dll\X.dll'
]]
function search(modname,path)
    modname = string.gsub(modname,"%","/")
    local msg = {}
    for c in string.gmatch(path,"[^;]+") do 
        local fname = string.gsub(c,"?",modname)
        local f = io.open(fname)
        if f then
            f:close()
            return fname
        else
            msg[#msg + 1] = string.format("\n\tno file '%s'",fname)
        end
    end
    return nil,table.concat(msg)
end
-- package.preload() 加载成功返回 否则返回nil